/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.projectimport.local; import com.google.gwt.user.client.ui.FormPanel; import com.google.web.bindery.event.shared.Event; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.ImportResponse; import org.eclipse.che.api.project.shared.dto.ProjectDescriptor; import org.eclipse.che.api.vfs.gwt.client.VfsServiceClient; import org.eclipse.che.api.vfs.shared.dto.Item; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.event.OpenProjectEvent; import org.eclipse.che.ide.api.project.wizard.ImportProjectNotificationSubscriber; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.ui.dialogs.ConfirmCallback; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.ui.dialogs.message.MessageDialog; import org.eclipse.che.test.GwtReflectionUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * Testing {@link LocalZipImporterPagePresenter} functionality. * * @author Roman Nikitenko */ @RunWith(MockitoJUnitRunner.class) public class LocalZipImporterPagePresenterTest { private static final String PROJECT_NAME = "test"; private static final String FILE_NAME = "test.zip"; private static final String RESPONSE = "<pre style=\"word-wrap: break-word; white-space: pre-wrap;\">{\"projectDescriptor\":{}}</pre>"; private static final String PARSED_RESPONSE = "{\"projectDescriptor\":{}}"; @Captor private ArgumentCaptor<AsyncRequestCallback<Item>> callbackCaptorForItem; @Mock private ProjectServiceClient projectServiceClient; @Mock private VfsServiceClient vfsServiceClient; @Mock private DtoFactory dtoFactory; @Mock private DialogFactory dialogFactory; @Mock private EventBus eventBus; @Mock private CoreLocalizationConstant locale; @Mock private ImportProjectNotificationSubscriber importProjectNotificationSubscriber; @Mock private LocalZipImporterPageView view; @InjectMocks private LocalZipImporterPagePresenter presenter; @Test public void showDialogTest() { presenter.show(); verify(view).setProjectName(eq("")); verify(view).setProjectDescription(eq("")); verify(view).setProjectVisibility(eq(true)); verify(view).setSkipFirstLevel(eq(true)); verify(view).showDialog(); } @Test public void shouldCloseDialogTest() { presenter.onCancelClicked(); verify(view).closeDialog(); } @Test public void correctProjectNameEnteredWhenZipForUploadChoosedTest() { when(view.getProjectName()).thenReturn(PROJECT_NAME); when(view.getFileName()).thenReturn(FILE_NAME); presenter.projectNameChanged(); verify(view).setEnabledImportButton(eq(true)); verify(view).hideNameError(); verify(view, never()).showNameError(); } @Test public void incorrectFileForUploadChoosedTest() { String incorrectFileName = "test.txt"; //not zip when(view.getProjectName()).thenReturn(PROJECT_NAME); when(view.getFileName()).thenReturn(incorrectFileName); presenter.projectNameChanged(); verify(view).setEnabledImportButton(eq(false)); verify(view, never()).showNameError(); } @Test public void emptyProjectNameEnteredTest() { String emptyName = ""; when(view.getFileName()).thenReturn(FILE_NAME); when(view.getProjectName()).thenReturn(emptyName); presenter.projectNameChanged(); verify(view).setEnabledImportButton(eq(false)); verify(view).showNameError(); } @Test public void incorrectProjectNameEnteredTest() { String incorrectName = "angularjs+"; when(view.getFileName()).thenReturn(FILE_NAME); when(view.getProjectName()).thenReturn(incorrectName); presenter.projectNameChanged(); verify(view).setEnabledImportButton(eq(false)); verify(view).showNameError(); } @Test public void fileNameChangedWhenCorrectFileForUploadChoosedTest() { when(view.getFileName()).thenReturn("fakepath\\test.zip"); when(view.getProjectName()).thenReturn(PROJECT_NAME); presenter.fileNameChanged(); verify(view).setProjectName(eq(PROJECT_NAME)); verify(view).setEnabledImportButton(eq(true)); verify(view).hideNameError(); verify(view, never()).showNameError(); } @Test public void fileNameChangedWhenIncorrectFileForUploadChoosedTest() { String parsedProjectName = ""; String incorrectFileName = "fakepath\\angularjs.txt"; //not zip when(view.getFileName()).thenReturn(incorrectFileName); when(view.getProjectName()).thenReturn(parsedProjectName); presenter.fileNameChanged(); verify(view, never()).setProjectName(eq(parsedProjectName)); verify(view, never()).setEnabledImportButton(anyBoolean()); } @Test public void extractFromHtmlFormatSubmitResultTest() { presenter.onSubmitComplete(RESPONSE); verify(dtoFactory).createDtoFromJson(PARSED_RESPONSE, ImportResponse.class); } @Test public void submitCompleteWhenImportIsSuccessTest() { reset(view); ImportResponse importResponse = mock(ImportResponse.class); ProjectDescriptor projectDescriptor = mock(ProjectDescriptor.class); when(dtoFactory.createDtoFromJson(anyString(), Matchers.<Class<ImportResponse>>anyObject())).thenReturn(importResponse); when(importResponse.getProjectDescriptor()).thenReturn(projectDescriptor); presenter.onSubmitComplete(RESPONSE); verify(view).setLoaderVisibility(eq(false)); verify(view).setInputsEnableState(eq(true)); verify(dtoFactory).createDtoFromJson(PARSED_RESPONSE, ImportResponse.class); verify(view).closeDialog(); verify(importProjectNotificationSubscriber).onSuccess(); verify(eventBus).fireEvent(Matchers.<Event<OpenProjectEvent>>anyObject()); verify(importProjectNotificationSubscriber, never()).onFailure(anyString()); } @Test public void submitCompleteWhenImportIsFailureTest() { reset(view); String response = "ERROR"; when(view.getProjectName()).thenReturn(PROJECT_NAME); presenter.onSubmitComplete(response); verify(view).setLoaderVisibility(eq(false)); verify(view).setInputsEnableState(eq(true)); verify(dtoFactory).createDtoFromJson(response, ImportResponse.class); verify(view).closeDialog(); verify(importProjectNotificationSubscriber, never()).onSuccess(); verify(importProjectNotificationSubscriber).onFailure(anyString()); verify(projectServiceClient).delete(eq(PROJECT_NAME), Matchers.<AsyncRequestCallback<Void>>anyObject()); } @Test public void onImportClickedWhenProjectWithSameNameAlreadyExistsTest() { when(view.getProjectName()).thenReturn(PROJECT_NAME); MessageDialog dialog = mock(MessageDialog.class); when(dialogFactory.createMessageDialog(anyString(), anyString(), (ConfirmCallback)anyObject())).thenReturn(dialog); presenter.onImportClicked(); verify(vfsServiceClient).getItemByPath(eq(PROJECT_NAME), callbackCaptorForItem.capture()); AsyncRequestCallback<Item> callback = callbackCaptorForItem.getValue(); GwtReflectionUtils.callOnSuccess(callback, mock(Item.class)); verify(view).setEnabledImportButton(eq(false)); verify(dialogFactory).createMessageDialog(anyString(), anyString(), (ConfirmCallback)anyObject()); verify(dialog).show(); verify(view, never()).submit(); verify(view, never()).setLoaderVisibility(anyBoolean()); verify(view, never()).setInputsEnableState(anyBoolean()); } @Test public void onImportClickedWhenShouldImportAndOpenProjectTest() { when(view.getProjectName()).thenReturn(PROJECT_NAME); MessageDialog dialog = mock(MessageDialog.class); when(dialogFactory.createMessageDialog(anyString(), anyString(), (ConfirmCallback)anyObject())).thenReturn(dialog); presenter.onImportClicked(); verify(vfsServiceClient).getItemByPath(eq(PROJECT_NAME), callbackCaptorForItem.capture()); AsyncRequestCallback<Item> itemCallback = callbackCaptorForItem.getValue(); GwtReflectionUtils.callOnFailure(itemCallback, mock(Throwable.class)); verify(dialogFactory, never()).createMessageDialog(anyString(), anyString(), (ConfirmCallback)anyObject()); verify(dialog, never()).show(); verify(importProjectNotificationSubscriber).subscribe(eq(PROJECT_NAME)); verify(view).setEncoding(eq(FormPanel.ENCODING_MULTIPART)); verify(view).setAction(anyString()); verify(view).submit(); verify(view).setLoaderVisibility(eq(true)); verify(view).setInputsEnableState(eq(false)); } }